热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

发生|简写_hive缓慢变化维

篇首语:本文由编程笔记#小编为大家整理,主要介绍了hive缓慢变化维相关的知识,希望对你有一定的参考价值。维度建模的数据仓库中,有一个概念叫SlowlyC

篇首语:本文由编程笔记#小编为大家整理,主要介绍了hive缓慢变化维相关的知识,希望对你有一定的参考价值。


维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成”缓慢变化维”,经常被简写为SCD。缓慢变化维的提出是因为在现实世界中,维度的属性并不是静态的,它会随着时间的流失发生缓慢的变化。这种随时间发生变化的维度我们一般称之为缓慢变化维,并且把处理维度表的历史变化信息的问题称为处理缓慢变化维的问题,有时也简称为处理SCD的问题。


  • 针对的需求:
    • 表中的部分字段会被更新
    • 需要查看某一个时间点或者时间段的历史快照信息
    • 变化的比例和频率不是很大

举个例子

我们在业务表中,比如工单(workorder)这张表,由于从工单创建到工单归档这中间需要很多处理人进行处理,处理时长也相对较长,我们从关系型数据到hive或hbase中就可能需要用到缓慢变化维。

比如,我们按照一天的间隔对数据进行抽取。第一天,mysql数据表如下:


idstatuscreateTimeupdateTime
112022-11-052022-11-05
222022-11-052022-11-05
312022-11-052022-11-05
422022-11-052022-11-05

到了第二天,MySQL中数据表如下:


idstatuscreateTimeupdateTime
112022-11-052022-11-05
232022-11-052022-11-06
312022-11-052022-11-05
422022-11-052022-11-05
522022-11-062022-11-06
622022-11-062022-11-06

很显然,第二天对id为2的数据进行了更新,且新增了id为5和6的两条新的数据。
对于在hive中,我们对于抽取过来的数据,需要做进一步的处理:


  • 针对当日抽取得到的数据进行分区(ods层)
  • 再建立dw层数据,即从ods层到dw层的数据处理,我们赋予两个新的字段:startTime和endTime
    • startTime,就是当日抽取的时间
    • endTime,就是我们数据的结束时间,对于新的数据,我们用9999-12-31表示,对于旧的数据,我们可以将其为抽取那天

实现过程


1、模拟数据



建立工单表,这里只做demo演示,所以只抽取更新的字段


在mysql中插入数据,表示为第一天以来的全部数据

create table if not exists workorder(
id varchar(50),
status varchar(50),
createtime varchar(50),
updatetime varchar(50)
) ;
insert into workorder(id , status , createtime, updatetime) values
('1', '1', '2022-11-05', '2022-11-05'),
('2', '2', '2022-11-05', '2022-11-05'),
('3', '1', '2022-11-05', '2022-11-05'),
('4', '2', '2022-11-05', '2022-11-05');

2、导入第一天的数据

在hive中,建立ods层的表,并分区,导入第一天数据

-- 创建ods层表
create table if not exists ods_workorder(
id string,
status string,
createtime string,
updatetime string
)
partitioned by (dt string)
row format delimited fields terminated by '\\t';
-- 新增表分区
alter table ods_workorder add partition (dt='2022-11-05');
-- 创建dw层表
create table if not exists dw_workorder(
id string,
status string,
createtime string,
updatetime string,
starttime string,
endtime string
)
row format delimited fields terminated by '\\t';

使用sqoop导入第一天数据到hive的ods层

sqoop import \\
--connect jdbc:mysql://localhost:3306/test \\
--username root \\
--password 123456 \\
--table workorder \\
--m 1 \\
--delete-target-dir \\
--fields-terminated-by '\\t' \\
--target-dir /user/hive/warehouse/ods_workorder/dt=2022-11-05

将第一天数据从ods导入dw层,由于是第一天数据,endtime默认是9999-12-31

insert overwrite table dw_workorder
select
id string,
status string,
createtime string,
updatetime string,
updatetime as starttime,
'9999-12-31' as endtime
from
ods_workorder
where
dt = '2022-11-05';

3、导入第二天数据

第二天,mysql中新增两条并更新了一条

UPDATE workorder SET status = '3', modifytime = '2022-11-06' WHERE id = '3';
INSERT INTO workorder(id, status, createtime, updatetime) VALUES
('5', '2', '2022-11-06', '2022-11-06'),
('6', '2', '2022-11-06', '2022-11-06');

使用sqoop进行增量导入

sqoop import \\
--connect jdbc:mysql://localhost:3306/test \\
--username root \\
--password 123456 \\
--target-dir /user/hive/warehouse/ods_workorder/dt=2022-11-06 \\
--query "select * from workorder where updatetime = '2022-11-06' and \\$CONDITIONS" \\
--delete-target-dir \\
--fields-terminated-by '\\t' \\
--m 1

这时候,在dw层中,我们需要新增一张表,用于计算endtime,同时,它存储在dw层中对于dw_workorder的“前面的数据”,在hive中

create temporary table if not exists dw_tmp_workorder(
id string,
status string,
createtime string,
updatetime string,
starttime string,
endtime string
)
row format delimited fields terminated by '\\t';

关键代码处理:将更新的旧数据设置endtime为2022-11-05,表示生效时间为当天,新的数据的endtime字段更新为9999-12-31,标识为最新的数据

insert overwrite table dw_tmp_workorder
select
t1.id,
t1.status,
t1.createtime,
t1.updatetime,
t1.starttime,
case when (t2.id is not null and t1.endtime = '9999-12-31' )
then '2022-11-05'
else t1.endtime
end as endtime
from
dw_workorder t1
left join
(select * from ods_workorder where dt='2022-11-06') t2
on t1.id = t2.id
union all
select
id,
status,
createtime,
updatetime,
updatetime as starttime,
'9999-12-31' as endtime
from
ods_workorder where dt='2022-11-06';

最后我们将tmp表中的数据插入到dw_workorder中

insert overwrite table dw_workorder
select * from dw_tmp_workorder;

至此,我们的数据就处理完成了

查询旧数据:

select * from dw_workorder where starttime <&#61; &#39;2022-11-05&#39; and endtime >&#61; &#39;2022-11-05&#39; ;

查询最新数据&#xff1a;

select * from dw_workorder where endtime &#61; &#39;9999-12-31&#39; ;

推荐阅读
  • ubuntu用sqoop将数据从hive导入mysql时,命令: ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 这篇文章主要介绍了Python拼接字符串的七种方式,包括使用%、format()、join()、f-string等方法。每种方法都有其特点和限制,通过本文的介绍可以帮助读者更好地理解和运用字符串拼接的技巧。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法
    本文介绍了修复安装win10失败并提示“磁盘布局不受UEFI固件支持”的方法。首先解释了UEFI的概念和作用,然后提供了两种解决方法。第一种方法是在bios界面中将Boot Mode设置为Legacy Support,Boot Priority设置为Legacy First,并关闭UEFI。第二种方法是使用U盘启动盘进入PE系统,运行磁盘分区工具DiskGenius,将硬盘的分区表设置为gpt格式,并留出288MB的内存。最后,通过运行界面输入命令cmd来完成设置。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
涉世未深的phper
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有